perm filename HUNK.RPG[UP,DOC] blob
sn#243613 filedate 1976-10-20 generic text, type C, neo UTF8
COMMENT ⊗ VALID 00002 PAGES
C REC PAGE DESCRIPTION
C00001 00001
C00002 00002 HUNKS PACKAGE
C00012 ENDMK
C⊗;
HUNKS PACKAGE
THE HUNKS PACKAGE PROVIDES LISP WITH A KIND OF "RECORD" OR
"SMALL VECTOR" FEATURE. THE HUNK DATA TYPE INTERACTS SMOOTHLY
WITH THE LIST DATA TYPE TO PROVIDE SOME INTERESTING CAPABILITIES.
THE HUNKS PACKAGE IS ONLY AVAILABLE IN BIBOP LISPS.
[A] A NEW DATA TYPE IS INTRODUCED INTO LISP, THE "HUNK".
HUNKS ARE SHORT VECTORS OF S-EXPRESSIONS. IN THE CURRENT
IMPLEMENTATION THERE ARE ACTUALLY SEVERAL SPACES OF
FOR HUNKS, VARIOUSLY CALLED HUNK4, HUNK8, HUNK16, ETC.
THESE WILL BE EXPLAINED IN DETAIL BELOW. IN SOME
CONTEXTS ORDINARY LIST CELLS ARE CONSIDERED TO BE HUNKS
OF LENGTH 2. HUNKS ARE NOT CONSIDERED TO BE ATOMS;
(ATOM H) RETURNS NIL FOR ANY HUNK H.
[B] (HUNKP X) IS A PREDICATE WHICH RETURNS T IFF X IS A HUNK.
IN THIS CONTEXT A LIST CELL IS NOT CONSIDERED TO BE A HUNK.
(CXR N H) RETURNS THE N'TH ELEMENT OF THE HUNK H, FOR 1≤N.
(CXR 0 H) RETURNS THE LAST ELEMENT OF H.
(CXR 1 H) IS EQUIVALENT TO (CAR H), AND (CXR 0 H)
IS EQUIVALENT TO (CDR H); IN FACT, THE CAR AND CDR
FUNCTIONS MAY BE USED ON HUNKS AS WELL AS ON LISTS.
(RPLACX N H Z) REPLACES THE N'TH COMPONENT OF H WITH Z FOR 1≤N.
(RPLACX 0 H Z) REPLACES THE LAST ELEMENT OF H WITH Z.
THE VALUE OF RPLACX IS ITS (MODIFIED) SECOND ARGUMENT.
(RPLACX 1 H Z) IS EQUIVALENT TO (RPLACA H Z),
AND (RPLACX 0 H Z) IS EQUIVALENT TO (RPLACD H Z).
(MAKHUNK N) CREATES A HUNK OF SIZE N AND RETURNS IT.
(MAKHUNK 0) RETURNS NIL, AND (MAKHUNK 1) OR (MAKHUNK 2)
RETURNS A LIST CELL. ALL COMPONENTS ARE INITIALIZED
TO NIL. THE COMPONENTS ARE NUMBERED 1, 2, ..., N-1, 0.
IT ALSO HAS AN EXTENDED DEFINITION: IF THE ARGUMENT TO
MAKHUNK IS A FIXNUM, IT CREATES A HUNK THAT BIG FILLED
WITH NILS. IF THE ARGUMENT IS A LIST, IT CREATES A HUNK
FILLED WITH THE ELEMENTS OF THE LIST. THUS
(MAKHUNK (LIST A B C D)) = (HUNK A B C D)
(HUNK A1 A2 ... AN-1 A0) IS EQUIVALENT TO
((LAMBDA (H)
(RPLACX 0 H A0)
...
(RPLACX N-1 H AN-1))
(MAKHUNK N))
THAT IS, IT CREATES A HUNK WHOSE COMPONENTS ARE THE
ARGUMENTS TO HUNK. NOTE THAT, AS FUNNY BOUNDARY
CASES, (HUNK) RETURNS NIL, AND (HUNK X)
IS THE SAME AS (NCONS X).
(HUNKSIZE H) RETURNS THE NUMBER OF COMPONENTS IN
THE HUNK H. HUNKSIZE OF A LIST CELL IS 2. NIL IS NOT
CONSIDERED A HUNK.
[C] EQUAL WILL COMPARE HUNKS BY DOING A RECURSIVE
COMPONENT BY COMPONENT COMPARISON. SXHASH WILL
COMPUTE THE HASH ON THE BASIS OF ALL COMPONENTS.
[D] HUNKS ARE PRINTED USING AN EXTENSION TO DOT NOTATION
SUGGESTED BY RMS. SINCE LIST CELLS ARE CONSIDERED TO
BE 2-HUNKS, AND ARE PRINTED AS (CAR . CDR), THE RESULT
OF (HUNK A0 A1 A2 +++ AN-2 AN-1) IS PRINTED AS
(A0 . A1 . A2 . +++ . AN-2 . AN-1 ), WHERE "+++"
IS USED AS AN ELLIPSIS TO AVOID CONFUSION WITH THE
DOT NOTATION. THUS WE HAVE:
(HUNK 0) => (0)
(HUNK 0 1) => (0 . 1)
(HUNK 0 1 2) => (0 . 1 . 2)
(HUNK 0 1 2 3) => (0 . 1 . 2 . 3)
NOTE ALSO THAT SINCE (HUNK 1) => (1),
(HUNK 0 (HUNK 1)) => (0 . (1))=> (0 1)
AND (HUNK (HUNK 0) 1) => ((0) . 1)
THEREFORE (HUNK 0 (HUNK 1 (HUNK 2 (HUNK 3)))) IS EQUIVALENT
TO (LIST 0 1 2 3)
[E] MOST OTHER FUNCTIONS WHICH OPERATE ON LIST STRUCTURE
WILL TREAT HUNKS AS LIST CELLS, USING ONLY THE FIRST
TWO POINTERS. (IN PARTICULAR, SUBST AND SUBLIS DO
NOT PRESENTLY KNOW ANYTHING SPECIAL ABOUT HUNKS;
HENCE (SUBST NIL NIL H) WILL NOT COPY A HUNK!)
EVAL ALSO TREATS HUNKS AS LIST CELLS; THUS THE EXPRESSION
(PLUS . FIXNUM . SIMP 1 2 3)
{CREATED BY SAYING "(HUNK 'PLUS 'FIXNUM 'SIMP
(HUNK 1 (HUNK 2 (HUNK 3))))"}
EVALUATES TO 6, IGNORING "FIXNUM" AND "SIMP".
IMAGINE THE POSSIBILITIES FOR HACKING!
[F] HUNKS ARE ALLOCATED IN SPACES CALLED HUNK4, HUNK8, ETC.
HUNKS WHICH RESIDE IN HUNK4 SPACE ARE ALL OF LENGTH 4, HUNKS
IN HUNK8 SPACE ARE OF LENGTH 8, AND SO ON. WHEN YOU ASK FOR
A HUNK OF LENGTH 3, FOR INSTANCE, YOU ARE GIVEN A HUNK IN HUNK4
SPACE.
WHY HUNKS?
HUNKS WERE INVENTED SOLELY TO SOLVE THE PROBLEM OF LIMITED
ADDRESS SPACE. WHEN YOU HAVE MANY SMALL CLUMPS OF DATA ("SMALL" = 5
TO 20 POINTERS), THEN HUNKS CAN REDUCE STORAGE BY A FACTOR OF 2 OVER
LISTS, AND THEY DON'T HAVE THE 6 TO 8 WORDS OF HEADER REQUIRED BY A
FULL-FLEDGED ARRAY. ON THE OTHER HAND, HUNKS ARE HARDER TO ALLOCATE
THAN LISTS, AND LESS FLEXIBLE THAN ARRAYS.